<?xml version="1.0" encoding="utf-8"?>
<!--
                                                                                     
 h       t     t                ::       /     /                     t             / 
 h       t     t                ::      //    //                     t            // 
 h     ttttt ttttt ppppp sssss         //    //  y   y       sssss ttttt         //  
 hhhh    t     t   p   p s            //    //   y   y       s       t          //   
 h  hh   t     t   ppppp sssss       //    //    yyyyy       sssss   t         //    
 h   h   t     t   p         s  ::   /     /         y  ..       s   t    ..   /     
 h   h   t     t   p     sssss  ::   /     /     yyyyy  ..   sssss   t    ..   /     
                                                                                     
	<https://y.st./>
	Copyright © 2017 Alex Yst <mailto:copyright@y.st>

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program. If not, see <https://www.gnu.org./licenses/>.
-->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<base href="https://y.st./en/coursework/CS1103/Debugging.xhtml" />
		<title>Debugging &lt;https://y.st./en/coursework/CS1103/Debugging.xhtml&gt;</title>
		<link rel="icon" type="image/png" href="/link/CC_BY-SA_4.0/y.st./icon.png" />
		<link rel="stylesheet" type="text/css" href="/link/basic.css" />
		<link rel="stylesheet" type="text/css" href="/link/site-specific.css" />
		<script type="text/javascript" src="/script/javascript.js" />
		<meta name="viewport" content="width=device-width" />
	</head>
	<body>
		<nav>
			<p>
				<a href="/en/">Home</a> |
				<a href="/en/a/about.xhtml">About</a> |
				<a href="/en/a/contact.xhtml">Contact</a> |
				<a href="/a/canary.txt">Canary</a> |
				<a href="/en/URI_research/"><abbr title="Uniform Resource Identifier">URI</abbr> research</a> |
				<a href="/en/opinion/">Opinions</a> |
				<a href="/en/coursework/">Coursework</a> |
				<a href="/en/law/">Law</a> |
				<a href="/en/a/links.xhtml">Links</a> |
				<a href="/en/coursework/CS1103/Debugging.xhtml.asc">{this page}.asc</a>
			</p>
			<hr/>
			<p>
				<a href="/en/coursework/BUS1101/" title="Principles of Business Management">BUS 1101</a> |
				<span class="hyperlink_unavailable" title="Basic Accounting">BUS 1102</span> |
				<span class="hyperlink_unavailable" title="Principles of Marketing">BUS 2201</span> |
				<span class="hyperlink_unavailable" title="Multinational Management">BUS 2207</span> |
				<span class="hyperlink_unavailable" title="Business and Society">BUS 3306</span> |
				<a href="/en/coursework/CS1101/" title="Programming Fundamentals">CS 1101</a> |
				<a href="/en/coursework/CS1102/" title="Programming 1">CS 1102</a> |
				<a href="/en/coursework/CS1103/" title="Programming 2">CS 1103</a> |
				<span class="hyperlink_unavailable" title="Computer Systems">CS 1104</span> |
				<a href="/en/coursework/CS2203/" title="Databases 1">CS 2203</a> |
				<span class="hyperlink_unavailable" title="Communications and Networking">CS 2204</span> |
				<a href="/en/coursework/CS2205/" title="Web Programming 1">CS 2205</a> |
				<a href="/en/coursework/CS2301/" title="Operating Systems 1">CS 2301</a> |
				<span class="hyperlink_unavailable" title="Software Engineering 1">CS 2401</span> |
				<span class="hyperlink_unavailable" title="Data Structures">CS 3303</span> |
				<span class="hyperlink_unavailable" title="Analysis of Algorithms">CS 3304</span> |
				<span class="hyperlink_unavailable" title="Web Programming 2">CS 3305</span> |
				<span class="hyperlink_unavailable" title="Databases 2">CS 3306</span> |
				<span class="hyperlink_unavailable" title="Operating Systems 2">CS 3307</span> |
				<span class="hyperlink_unavailable" title="Information Retrieval">CS 3308</span> |
				<span class="hyperlink_unavailable" title="Comparative Programming Languages">CS 4402</span> |
				<span class="hyperlink_unavailable" title="Software Engineering 2">CS 4403</span> |
				<span class="hyperlink_unavailable" title="Advanced Networking and Data Security">CS 4404</span> |
				<span class="hyperlink_unavailable" title="Mobile Applications">CS 4405</span> |
				<span class="hyperlink_unavailable" title="Computer Graphics">CS 4406</span> |
				<span class="hyperlink_unavailable" title="Data Mining and Machine Learning">CS 4407</span> |
				<span class="hyperlink_unavailable" title="Artificial Intelligence">CS 4408</span> |
				<span class="hyperlink_unavailable" title="English Composition 2">ENGL 1102</span> |
				<span class="hyperlink_unavailable" title="World Literature">ENGL 1405</span> |
				<span class="hyperlink_unavailable" title="Introduction to Environmental Science">ENVS 1301</span> |
				<a href="/en/coursework/HIST1421/" title="Greek and Roman Civilization">HIST 1421</a> |
				<span class="hyperlink_unavailable" title="College Algebra">MATH 1201</span> |
				<span class="hyperlink_unavailable" title="Calculus">MATH 1211</span> |
				<span class="hyperlink_unavailable" title="Introduction to Statistics">MATH 1280</span> |
				<span class="hyperlink_unavailable" title="Discrete Mathematics">MATH 1302</span> |
				<span class="hyperlink_unavailable" title="Introduction to Philosophy">PHIL 1402</span> |
				<a href="/en/coursework/PHIL1404/" title="Ethics and Social Responsibility">PHIL 1404</a> |
				<a href="/en/coursework/POLS1503/" title="Globalization">POLS 1503</a> |
				<span class="hyperlink_unavailable" title="Introduction to Psychology">PSYC 1504</span> |
				<a href="/en/coursework/UNIV1001/" title="Online Education Strategies">UNIV 1001</a>
			</p>
			<hr/>
			<p>
				<a href="/en/coursework/CS1103/Unit1.java.xhtml" title="Unit1.java">Unit 1</a> |
				<a href="/en/coursework/CS1103/SimpleRandomSentences.java.xhtml" title="SimpleRandomSentences.java">Unit 2</a> |
				<a href="/en/coursework/CS1103/Tape.java.xhtml" title="Tape.java">Unit 3</a> |
				<a href="/en/coursework/CS1103/Debugging.xhtml" title="Debugging">Unit 4</a> |
				<a href="/en/coursework/CS1103/Unit5.java.xhtml" title="Unit5.java">Unit 5</a> |
				<a href="/en/coursework/CS1103/DrawTextPanel.java.xhtml" title="DrawTextPanel.java">Unit 6</a> |
				<a href="/en/coursework/CS1103/Unit7.java.xhtml" title="Unit7.java">Unit 7</a>
			</p>
			<hr/>
		</nav>
		<header>
			<h1>Debugging</h1>
			<p>Written in <span title="Programming 2">CS 1103</span> of <a href="http://www.uopeople.edu/">University of the People</a>, finalised on 2017-07-12</p>
		</header>
<p>
	First, I tried running the program without any debugging tools.
	My goal was to find the first infinite loop, then start debugging that with Eclipse's debugging tools.
	With all the infinite loops cleared up, I could better focus on the other errors.
	My old computer was weak, and infinite loops in Java and Eclipse would sometimes freeze the whole machine.
	My new machine, the one I&apos;m working on now, is weaker still, so I wanted the worst issues out of the way as soon as possible.
</p>
<p>
	However, the program was so buggy it raised errors before even starting.
	It wasn&apos;t possible to use the debugger to locate these problems, as the program wasn&apos;t able to compile and run.
	They needed to be debugged by hand.
	Lines 20, 21, and 22 each contained a type mismatch in the variable assignments.
	This was easily fixed by adding a typecast, <code>(int[])</code>, just after the assignment operator and before the method call.
	Next, Eclipse told me the loop starting on line 57 was dead code; it would never be executed.
	I stared at it a while, but couldn&apos;t figure out why the loop would never execute.
	I did notice another error though, which is that the function would return after checking the first value of the array, checking only that value.
	Fixing that, the error message about dead code went away.
	It seems Eclipse was confused and complaining about the wrong problem.
	With those two errors fixed, I was able to run the program to find the next spot to debug.
</p>
<p>
	Running the program, the output halted after the initial built-in sort.
	Thant meant that the first custom sorting algorithm, <code>bubbleSort()</code>, was non-terminating.
	I added a breakpoint to the beginning of each loop and one to the end of the innermost loop, and tried running the debugger.
	What I noticed was that <code>j</code> never incremented, but <code>i</code> was extending up beyond its intended limit.
	At first, I thought these to be two isolated incidents.
	The <code>j</code> loop was failing to execute and the <code>i</code> loop was failing to terminate.
	However, that wasn&apos;t the issue at all.
	The <code>j</code> loop was incrementing the <code>*wrong variable*</code>, and as a result, the <code>j</code> loop was never terminating.
	The <code>j</code> loop was incrementing <code>i</code>, which had the additional effect of making the <code>i</code> loop appear to be buggy as well.
	Fixing the <code>j</code> loop to increment <code>j</code> instead of <code>i</code> caused the loop to behave as intended.
	That seemed to be the only infinite loop in the code, so with that cleared up, I started debugging the methods in order.
</p>
<p>
	Next up was <code>selectionSort()</code>.
	This method terminated, but was producing different output than <code>java.util.Arrays.sort()</code> and <code>bubbleSort()</code>.
	Again, I added breakpoints to the beginning of each loop and to the end of the innermost loop.
	That wasn&apos;t really helping though, so I added another breakpoint to the end of the outermost loop as well.
	I ran through the program several times, thoroughly confused by what I was seeing.
	Eventually though, I noticed that the array to be sorted was randomly generated, so I wasn&apos;t looking at the same array every time.
	It helped to know that.
	On the next run, I saw that a <code>7</code> got marked as the highest value in the array, but a <code>10</code> was present in the array too.
	How did that happen?
	Something in the code was causing the ten to get overlooked.
	Taking a look at the conditional in which <code>positionOfMax</code> is set, I found the error.
	Or rather, the errors.
	First, the <code>for</code> loop there was setting the initial value of <code>i</code> to <code>1</code>.
	Real programming languages, such as Java, index from zero.
	Second, the value of <code>i</code> wasn&apos;t being used in the conditional at all.
	Instead, the hard-coded value <code>1</code> was being used.
	With both of those fixed, <code>selectionSort()</code> provided the same results as the previous two sorting methods.
</p>
<p>
	Lastly, it was time to take a look at <code>insertionSort()</code>.
	It appeared to give a sorted array, but with the wrong values included.
	I added breakpoints to the beginning and end of both of the loops.
	What I noticed was that the value was being copied into and out of <code>temp</code>, but the other value that needed to move wasn&apos;t going anywhere.
	This was causing one value to be cloned and another lost.
	The problem was caused by the fact that in the inner loop, <code>pos+1</code> is the spot to take the new value, but outside the inner loop, <code>pos</code> was being used instead.
	I changed <code>array[pos] = temp;</code> to <code>array[pos+1] = temp;</code>, and that cleared up the duplication problem.
	However, the method was no longer generating a perfectly-sorted array, at least not every time.
	Sometimes, the array would be perfectly sorted, but other times, one value would be inappropriately moved to the beginning of the array.
	The issue seemed to be that the first element was being treated differently than the others.
	The problem was that in the while loop&apos;s conditional, <code>pos &gt; 0</code> was used.
	If the value of <code>pos</code> was zero, the loop wouldn&apos;t execute, so the first element wasn&apos;t properly handled.
	Changing it to <code>pos &gt;= 0</code> (<code>pos &gt; -1</code> would be an even more fun solution), everything ran as intended.
	With that, the entire program behaved as it should and provided reasonable output.
</p>
		<hr/>
		<p>
			Copyright © 2017 Alex Yst;
			You may modify and/or redistribute this document under the terms of the <a rel="license" href="/license/gpl-3.0-standalone.xhtml"><abbr title="GNU&apos;s Not Unix">GNU</abbr> <abbr title="General Public License version Three or later">GPLv3+</abbr></a>.
			If for some reason you would prefer to modify and/or distribute this document under other free copyleft terms, please ask me via email.
			My address is in the source comments near the top of this document.
			This license also applies to embedded content such as images.
			For more information on that, see <a href="/en/a/licensing.xhtml">licensing</a>.
		</p>
		<p>
			<abbr title="World Wide Web Consortium">W3C</abbr> standards are important.
			This document conforms to the <a href="https://validator.w3.org./nu/?doc=https%3A%2F%2Fy.st.%2Fen%2Fcoursework%2FCS1103%2FDebugging.xhtml"><abbr title="Extensible Hypertext Markup Language">XHTML</abbr> 5.1</a> specification and uses style sheets that conform to the <a href="http://jigsaw.w3.org./css-validator/validator?uri=https%3A%2F%2Fy.st.%2Fen%2Fcoursework%2FCS1103%2FDebugging.xhtml"><abbr title="Cascading Style Sheets">CSS</abbr>3</a> specification.
		</p>
	</body>
</html>

